package com.library.service;

import com.library.dao.BookRepository;
import com.library.entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpSession;
import java.util.*;

/**
 * 图书服务类，提供关于图书的各种操作，如查询、添加、删除、编辑等。
 */
@Service
public class BookService {

    @Autowired
    private BookRepository bookRepository;

    /**
     * 根据类别查询书籍并返回分页数据。
     *
     * @param categoryName 类别名称。如果类别为空，则返回所有书籍。
     * @return 根据类别查询到的书籍列表，如果类别为空，则返回所有书籍。
     */
    public List<Book> getBooksByCategory(String categoryName) {
        if (categoryName == null || categoryName.isEmpty()) {
            return bookRepository.findAll();  // 返回所有书籍
        } else {
            return bookRepository.findByCategory(categoryName);  // 按照类别返回书籍
        }
    }

    /**
     * 根据搜索关键词查询书籍，并合并按作者和类别查询的结果。
     *
     * @param query 搜索关键词，可能是标题、作者或类别名称。
     * @return 根据关键词查询到的书籍列表，去除重复项。
     */
    public List<Book> searchBooks(String query) {
        String[] queryParts = query.split("");  // 将查询字符串按字符拆分
        Map<Long, Book> uniqueBooksMap = new HashMap<>();  // 使用 Map 来按 id 去重

        // 查找完整标题的书籍并按 id 去重
        List<Book> books = bookRepository.findByTitle(query);
        for (Book book : books) {
            uniqueBooksMap.put(book.getId(), book);  // 使用 Book 的 id 作为键来去重
        }

        // 针对每个字符进行查询，并将查询结果按 id 去重
        for (String part : queryParts) {
            List<Book> filteredBooks = bookRepository.findByTitle(part);
            for (Book book : filteredBooks) {
                uniqueBooksMap.put(book.getId(), book);  // 按 id 去重
            }
        }

        // 返回去重后的书籍列表
        return new ArrayList<>(uniqueBooksMap.values());  // 获取 Map 中所有的值（去重后的书籍）
    }


    /**
     * 删除书籍。
     *
     * @param bookId 书籍ID。
     * @return 操作结果的消息。
     */
    public String deleteBook(Long bookId) {
        Book book = bookRepository.findById(bookId);
        if ((book.getTotalCopies() - book.getAvailableCopies()) > 0) {
            return "Cannot delete book. There are borrowed copies.";  // 如果有借出的副本，不能删除
        } else {
            bookRepository.deleteById(bookId);  // 删除书籍
            return "Book deleted successfully!";
        }
    }

    /**
     * 添加一本新书到库中

     */
    public String addBook(Book book) {
        // 创建图书对象并设置属性
        try {
            // 保存新书到数据库
            bookRepository.save(book);
            return "Book added successfully!";
        } catch (Exception e) {
            // 捕获异常并处理
            e.printStackTrace();
            return "Error occurred while adding the book. Please try again.";
        }
    }

    /**
     * 编辑书籍信息。
     *
     * @param id 书籍ID。
     * @param title 书名。
     * @param isbn 书籍ISBN号。
     * @param author 书籍作者。
     * @param publisher 书籍出版商。
     * @param category 书籍类别。
     * @param totalCopies 书籍总副本数。
     * @param availableCopies 书籍可用副本数。
     * @return 操作结果的消息。
     */
    public String editBook(Long id, String title, String isbn, String author, String publisher, String category, int totalCopies, int availableCopies) {
        Book book = bookRepository.findById(id);
        book.setTitle(title);
        book.setIsbn(isbn);
        book.setAuthor(author);
        book.setPublisher(publisher);
        book.setCategory(category);
        book.setTotalCopies(totalCopies);
        book.setAvailableCopies(availableCopies);

        bookRepository.save(book);  // 保存更新后的书籍

        return "Book edited successfully!";
    }

    /**
     *
     * @return 返回书id和title的hashMap
     */
    public Map<Long,String> getId_BookName(){
        Map<Long,String> map = new HashMap<>();
        List<Book> books = bookRepository.findAll();
        for (Book book : books) {
            map.put(book.getId(), book.getTitle());
        }
        return map;
    }

    public Book findBookById(long bookId){
        return bookRepository.findById(bookId);
    }
}
